﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using middleware.utiles;
using System.Windows.Forms;
using System.ServiceModel;
using middleware.entradaWcf.ServicioEntrada;

namespace middleware.entradaWcf
{
    class BandejaEntradaWcf : ITipoBandejaEntrada
    {

        //Formato de configuracion
        //Direccion|Configuracion|Seleccion|Actualizacion|SentenciaActualizacion
        private string direccion;
        private string configuracion;
        private string seleccion;
        private string sentenciaActualizacion;
        private string actualizacion;

        private const string NOMBRE_BANDEJA = "BandejaEntradaWCF";

        public int ElementosSinLeer()
        {
            int result = 0;

            System.ServiceModel.Channels.Binding b = new BasicHttpBinding("BasicHttpBinding_IServicioEntrada");           
            EndpointAddress ra = new EndpointAddress(direccion);
            
            using (ServicioEntradaClient servicio = new ServicioEntradaClient(b,ra))
            {
                result = servicio.WSElementosSinLeer(configuracion,seleccion);
            }

            return result;
        }

        public Mensaje ObtenerMensaje()
        {
            Mensaje result = null;
            Atributo atributo = null;
            Mensajes mensajeWCF = null;

            System.ServiceModel.Channels.Binding b = new BasicHttpBinding("BasicHttpBinding_IServicioEntrada");
            EndpointAddress ra = new EndpointAddress(direccion);

            using (ServicioEntradaClient servicio = new ServicioEntradaClient(b, ra))
            {
                //Obtengo el mensaje con el formato del wcf
                mensajeWCF = servicio.WSObtenerMensaje(configuracion, seleccion);
                
                //Armo el nuevo mensaje y lo retorno
                result = new Mensaje();
                result.fecha = System.DateTime.Now;
                result.titulo = mensajeWCF.Titulo;
                foreach (Atributos atributoWCF in mensajeWCF.Atributos)
                {
                    atributo = new Atributo { mensaje = result, 
                                             nombre = atributoWCF.Nombre,
                                               tipo = atributoWCF.Tipo,
                                               valor = atributoWCF.Valor};
                    result.atributos.Add(atributo);
                }

                //Lo marco como leido
                servicio.WSMarcarComoLeido(configuracion,mensajeWCF,actualizacion,sentenciaActualizacion);
            }

            return result;
        }

        public void MarcarComoLeido(Mensaje mensaje)
        {
        /*
         * No se utiliza este metodo ya que desde el middleware se pierde la referencia
         * al id del mensaje de la base de datos, por eso se marca como leido al obtenerlo
         * en el obtenerMensaje()
         */  
        }

        public string getConfiguracion()
        {
            string configuracion = "";

            configuracion += direccion;
            configuracion += "|";
            configuracion += configuracion;
            configuracion += "|";
            configuracion += seleccion;
            configuracion += "|";
            configuracion += actualizacion;
            configuracion += "|";
            configuracion += sentenciaActualizacion;

            return configuracion;
        }

        public void setConfiguracion(string c)
        {
            char[] delimitadores = { '|' };

            string[] palabras = c.Split(delimitadores);

            direccion = palabras[0];
            configuracion = palabras[1];
            seleccion = palabras[2];
            actualizacion = palabras[3];
            sentenciaActualizacion = palabras[4];
        }

        override
        public string ToString()
        {
            return NOMBRE_BANDEJA;
        }

        public UserControl getVentanaConfiguracion()
        {
            VentanaConfiguracion aRetornar = new VentanaConfiguracion();
            return aRetornar;
        }

        //Procedimiento que recibe una instancia del usercontrol "VentanaConfiguracion"
        //y retorna la configuracion
        public string getConfiguracionFormulario(UserControl uc)
        {
            string aRetornar;
            VentanaConfiguracion uc2 = (VentanaConfiguracion)uc;
            aRetornar = uc2.getConfiguracion();
            return aRetornar;
        }

        public void setConfiguracionFormulario(UserControl uc, string conf)
        {
            VentanaConfiguracion ventana = (VentanaConfiguracion)uc;
            ventana.setConfiguracion(conf);
        }

    }
}
